
// 需要对target是数组的情况进行处理
export function set(target, key, val) {
  // 1.判断target是数组，并且key是一个有效索引
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    target.length = Math.max(target.length, key)
    target.splice(key, 1, val)
    return val
  }

  // 2.判断key已经存在target中
  /**
   * 因为key已经存在了target中，所以这个key已经被侦测到了变化。这种情况直接修改数据
   */
  if (key in target && !(key in Object.prototype)) {
    target[key] = val;
    return val
  }

  // 3.处理新增的属性
  const ob = target.__ob__
  if (target._isVue || (ob && ob.vmCount)) {
    process.env.NODE_ENV !== 'production' && warn('Avoid adding reactive properties to a Vue instance or its root $data' +
      'at runtime - declare it upfront in the data option.')
    return val
  }
  if (!ob) {
    target[key] = val
    return val
  }
  // 是新增的属性，需要追踪这个新属性的变化
  defineReactive(ob.value, key, val)
  ob.dep.notify()
  return val
}